package me.mingshan.leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * https://leetcode.cn/problems/excel-sheet-column-title/description/?envType=problem-list-v2&envId=f3aYc4KH
 * <p>
 * <p>
 * 给你一个整数 columnNumber ，返回它在 Excel 表中相对应的列名称。
 * <p>
 * 例如：
 * <p>
 * A -> 1
 * B -> 2
 * C -> 3
 * ...
 * Z -> 26
 * AA -> 27
 * AB -> 28
 * ...
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：columnNumber = 1
 * 输出："A"
 * 示例 2：
 * <p>
 * 输入：columnNumber = 28
 * 输出："AB"
 * 示例 3：
 * <p>
 * 输入：columnNumber = 701
 * 输出："ZY"
 * 示例 4：
 * <p>
 * 输入：columnNumber = 2147483647
 * 输出："FXSHRXW"
 *
 * @author hanjuntao
 * @date 2025/5/29 0029
 */
public class L_168_ExcelSheetColumnTitle {

    public static void main(String[] args) {

        int columnNumber = 701;

        // AC
        System.out.println(convertToTitle(columnNumber));
    }
    /*
    *
    *

        Excel列名的规则‌：

        Excel中的列名使用字母表示，从A到Z，再到AA到AZ，以此类推。具体规则如下：

        ‌单字母列‌：从A到Z，对应第1列到第26列。
        ‌双字母列‌：从AA到ZZ，对应第27列到第702列。
        ‌三字母列‌：从AAA到XFD，对应第703列到第16384列‌
    *
    */

    /**
     * 思路：
     * 1. 26进制转换
     *
     * @param columnNumber
     * @return
     */
    public static String convertToTitle(int columnNumber) {
        // 得到一个数组，存放26进制的数字
        // 余数范围：0-25
        List<Integer> list = new ArrayList<>();

        while (columnNumber > 0) {
            columnNumber = columnNumber - 1;
            int i = columnNumber % 26;

            System.out.println(i);

            list.add(i);
            columnNumber = columnNumber / 26;
        }

        // 如何反向计算出值？

        cal(list);


        return getString(list);
    }

    /**
     *
     * 反向计算
     *
     * <pre>
     *
     * </pre>
     *
     * @param list
     */
    private static void cal(List<Integer> list) {
        int r = 0;
        for (int x = list.size() - 1; x >= 0; x--) {
            Integer i = list.get(x);
            r += (int) ((i + 1) * Math.pow(26, x));
        }

        System.out.println(r);
    }

    private static String getString(List<Integer> list) {
        // 逆序
        StringBuilder sb = new StringBuilder();

        for (int x = list.size() - 1; x >= 0; x--) {
            Integer i = list.get(x);
            if (i == 0) {
                sb.append('A');
            } else if (i == 1) {
                sb.append('B');
            } else if (i == 2) {
                sb.append('C');
            } else if (i == 3) {
                sb.append('D');
            } else if (i == 4) {
                sb.append('E');
            } else if (i == 5) {
                sb.append('F');
            } else if (i == 6) {
                sb.append('G');
            } else if (i == 7) {
                sb.append('H');
            } else if (i == 8) {
                sb.append('I');
            } else if (i == 9) {
                sb.append('J');
            } else if (i == 10) {
                sb.append('K');
            } else if (i == 11) {
                sb.append('L');
            } else if (i == 12) {
                sb.append('M');
            } else if (i == 13) {
                sb.append('N');
            } else if (i == 14) {
                sb.append('O');
            } else if (i == 15) {
                sb.append('P');
            } else if (i == 16) {
                sb.append('Q');
            } else if (i == 17) {
                sb.append('R');
            } else if (i == 18) {
                sb.append('S');
            } else if (i == 19) {
                sb.append('T');
            } else if (i == 20) {
                sb.append('U');
            } else if (i == 21) {
                sb.append('V');
            } else if (i == 22) {
                sb.append('W');
            } else if (i == 23) {
                sb.append('X');
            } else if (i == 24) {
                sb.append('Y');
            } else if (i == 25) {
                sb.append('Z');
            }
        }

        return sb.toString();
    }
}
